/**
 *	
  Semantic/sI'mentık/ Versioning是一个前端通用的版本定义规范。
    格式为：{MAJOR}.{MINOR}.{PATCH}-{alpha|beta|rc}.{number}。要求实现compare(a,b)方法,比较ab两个版本大小。
			+ 当a>b是返回1;
			+ 当a=b是返回0;
			+ 当a<b是返回-1;
			其中: rc>beta>alpha,major>minor>patch;
			例子: 1.2.3<1.2.4<1.3.0-alpha.1<1.3.0-alpha.2<1.3.0-beta.1<1.3.0-rc.1<1.3.0
		
		课后:
			输入: ['1.1', '2.3.3', 14.3.5', 10.3.1', '0.302.1', '4.20.0', '4.3.5.1', '1.2.3.4.5']
			输出: ['0.3.1', '0.302.1', '1.1', '1.2.3.4.5', '2.3.3', '4.3.5', '4.3.5.1', 4.20.0י']
 */

const compare = (a, b) => {
  let reg = /^\d+(\.\d+){2}(-(alpha|beta|rc)\.\d+)?$/
  let n = -1,
    diff,
    flag

  if (!reg.test(a) || !reg.test(b)) throw new Error('请输入正确的版本号格式')
  a = a.split(/(?:\.|-)/g)
  b = b.split(/(?:\.|-)/g)
  // console.log(a,b)
  // 基于递归实现版本号的比较
  const recursion = () => {
    n++
    let item1 = a[n],
      item2 = b[n]
    // 有任意项不存在时
    if (!item1 || !item2) {
      flag = !item1 && !item2 ? 0 : !item1 ? 1 : -1
      return
    }
    diff = isNaN(item1) || isNaN(item2) ? item1.localeCompare(item2) : item1 - item2
    if (+diff === 0) {
      // 第一次比较时相等时，基于递归继续比较后面
      recursion()
      return
    }
    flag = diff > 0 ? 1 : -1
  }
  recursion()
  return flag
}

console.log(compare('1.2.0-rc.1', '1.2.0'))
